2
תגובות
Fluent Interface
פתח
alexs3
,
היי חברה אשמח להסבר קצר על Fluent Interface איך מישמים את זה
תודה מראש
תודה מראש
2 תשובות
fluent interface איננו איזה רעיון גדול בתכנות. זהו שם למצב שבו מתודה מחזירה מופע של המחלקה אליה היא שייכת, ככה שעל התוצאה שהוחזרה (על האובייקט שהוחזר) ניתן להמשיך ולהפעיל אותה המתודה.
בדרך כלל מתודות בקוד שלך מחזירות ערך כלשהו. למשל מספר, או מערך, או מופע של מחלקה כלשהי. ניקח מחלקה פשוטה עם שני מתודות:
class Calculator
{
private $sum = 0;
public function add($int)
{
$this->sum += $int;
}
public function getResult()
{
return $this->sum;
}
}
$calculator = new Calculator();
$calculator->add(5);
$caluclator->add(5);
$caluclator->add(5);
echo $calculator->getResult(); // 15
{
private $sum = 0;
public function add($int)
{
$this->sum += $int;
}
public function getResult()
{
return $this->sum;
}
}
$calculator = new Calculator();
$calculator->add(5);
$caluclator->add(5);
$caluclator->add(5);
echo $calculator->getResult(); // 15
במקרה של המחלקה הזו, המתודה getResult מחזירה מספר
ואילו המתודה add לא מחזירה שום דבר.
אם ננסה להציב את התוצאה של הפעולה add לתוך משתנה, המשתנה ישאר ריק:
$void = ( $calculator->add(5) );
echo $void; // nothing
echo $void; // nothing
עכשיו נשנה את המתודה `add` כך, שתחזיר את המופע של המחלקה עצמה:
public function add($int)
{
$this->sum += $int;
return $this;
}
{
$this->sum += $int;
return $this;
}
מה מחזירה הפעולה add עכשיו ? היא מחזירה את אותו המופע ששמור במשתנה calculator
$calc2 = ( $calculator->add(5) );
echo $calc2 === $calculator; // true
echo $calc2 === $calculator; // true
היות שהמופע תחת calc2 הוא אותו מופע, גם לו יש מתודה בשם add שממשיכה את הרצף.
אפשר לקצר את הכתיבה וליצור שרשרת כזו:
$calculator->add(1)->add(2)->add(3)->getResult(); // 6
אז מה זה נותן?
שום דבר מלבד טיפה קיצור בקוד. אין לזה שום יתרונות מיוחדים, שמאפשרים לך לעשות משהו מיוחד שלא יכולת לפני. משתמשים בזה לצורך נוחות בלבד, למשל ב jquery
$("#p1").css("color", "red").slideUp(2000).slideDown(2000);
או בספריות מסד נתונים:
$db->select('field1')->from('table2')->where('x = 3')->getResults();